package marketing

import (
	"errors"
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// MerchantActivityAddRequest 商户活动新增请求
type MerchantActivityAddRequest struct {
	models.OrgBaseRequest
	// ActID 活动ID
	ActID string `json:"act_id,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// TermNos 终端号列表
	TermNos []string `json:"term_nos,omitempty"`
	// StartTime 商户活动开始时间，格式yyyy-MM-dd HH:mm:ss
	StartTime string `json:"start_time,omitempty"`
	// EndTime 商户活动结束时间，格式yyyy-MM-dd HH:mm:ss
	EndTime string `json:"end_time,omitempty"`
	// UpdateQuotas 商户额度信息
	UpdateQuotas []*MerchantQuotaInfo `json:"update_quotas,omitempty"`
}

// NewMerchantActivityAddRequest 创建新的商户活动新增请求
func NewMerchantActivityAddRequest() *MerchantActivityAddRequest {
	return &MerchantActivityAddRequest{}
}

// SetActID 设置活动ID
func (m *MerchantActivityAddRequest) SetActID(actID string) *MerchantActivityAddRequest {
	m.ActID = actID
	return m
}

// SetMerchNo 设置商户号
func (m *MerchantActivityAddRequest) SetMerchNo(merchNo string) *MerchantActivityAddRequest {
	m.MerchNo = merchNo
	return m
}

// SetTermNos 设置终端号列表
func (m *MerchantActivityAddRequest) SetTermNos(termNos []string) *MerchantActivityAddRequest {
	m.TermNos = termNos
	return m
}

// SetStartTime 设置商户活动开始时间
func (m *MerchantActivityAddRequest) SetStartTime(startTime string) *MerchantActivityAddRequest {
	m.StartTime = startTime
	return m
}

// SetEndTime 设置商户活动结束时间
func (m *MerchantActivityAddRequest) SetEndTime(endTime string) *MerchantActivityAddRequest {
	m.EndTime = endTime
	return m
}

// SetUpdateQuotas 设置商户额度信息
func (m *MerchantActivityAddRequest) SetUpdateQuotas(updateQuotas []*MerchantQuotaInfo) *MerchantActivityAddRequest {
	m.UpdateQuotas = updateQuotas
	return m
}

// Path 获取接口路径
func (m *MerchantActivityAddRequest) Path() string {
	return "/open/org/bank/act-bridge/act-merch-relation/add"
}

// CheckRequiredParams 检查必需参数
func (m *MerchantActivityAddRequest) CheckRequiredParams(config *core.Config) error {
	// 检查活动ID
	if m.ActID == "" {
		return errors.New("活动ID不能为空")
	}
	// 检查商户号
	if m.MerchNo == "" {
		return errors.New("商户号不能为空")
	}
	return nil
}

// ToMap 将请求对象转换为字典，过滤掉值为空的字段
func (m *MerchantActivityAddRequest) ToMap() (map[string]interface{}, error) {
	data, err := m.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加当前字段
	if m.ActID != "" {
		data["act_id"] = m.ActID
	}
	if m.MerchNo != "" {
		data["merch_no"] = m.MerchNo
	}
	if len(m.TermNos) > 0 {
		data["term_nos"] = m.TermNos
	}
	if m.StartTime != "" {
		data["start_time"] = m.StartTime
	}
	if m.EndTime != "" {
		data["end_time"] = m.EndTime
	}
	if len(m.UpdateQuotas) > 0 {
		quotaMaps := make([]map[string]interface{}, 0, len(m.UpdateQuotas))
		for _, quota := range m.UpdateQuotas {
			if quotaMap, err := quota.ToMap(); err == nil {
				quotaMaps = append(quotaMaps, quotaMap)
			}
		}
		if len(quotaMaps) > 0 {
			data["update_quotas"] = quotaMaps
		}
	}

	return data, nil
}

// MerchantActivityAddResponse 商户活动新增响应
type MerchantActivityAddResponse struct {
	models.StandardResponse
}

// NewMerchantActivityAddResponse 创建新的商户活动新增响应
func NewMerchantActivityAddResponse() *MerchantActivityAddResponse {
	return &MerchantActivityAddResponse{}
}
